package cn.rulian.base.common.service;

import java.util.List;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.transaction.annotation.Transactional;

/**
 * 服务层-基类 <br/>
 * 主要用于自动对外暴露dao层JpaRepository接口的一些常用方法，避免一些基础方法的重复编码工作量。
 */
public abstract class BaseService<T>
{
	protected abstract JpaRepository<T, Long> getDao();

	/**
	 * 根据id 查询一个对象。返回对象本身，当对象不存在时，返回null
	 */
	public T findOne(Long id)
	{
		return this.getDao().findOne(id);
	}

	/**
	 * 保存
	 */
	@Transactional
	public T save(T bo)
	{
		return this.getDao().save(bo);
	}

	/**
	 * 保存并强制同步数据库
	 */
	@Transactional
	public T saveAndFlush(T bo)
	{
		return this.getDao().saveAndFlush(bo);
	}

	/**
	 * 批量保存，并返回对象List
	 */
	@Transactional
	public List<T> save(Iterable<T> bos)
	{
		return this.getDao().save(bos);
	}

	/**
	 * 根据id 删除
	 */
	@Transactional
	public void delete(Long id)
	{
		this.getDao().delete(id);
	}

	/**
	 * 删除一个对象 
	 */
	@Transactional
	public void delete(T bo)
	{
		this.getDao().delete(bo);
	}

	/**
	 * 批量删除，集合对象（后台执行时，一条一条删除）
	 */
	@Transactional
	public void delete(Iterable<T> bos)
	{
		this.getDao().delete(bos);
	}

	/**
	 * 删除所有 （后台执行时，一条一条删除）
	 */
	@Transactional
	public void deleteAll()
	{
		this.getDao().deleteAll();
	}

	/**
	 * 批量删除 集合对象（后台执行时，生成一条语句执行，用多个or条件）
	 */
	@Transactional
	public void deleteInBatch(Iterable<T> bos)
	{
		this.getDao().deleteInBatch(bos);
	}

	/**
	 * 删除所有 （执行一条语句，如：delete from user）
	 */
	@Transactional
	public void deleteAllInBatch()
	{
		this.getDao().deleteAllInBatch();
	}

	/**
	 * 查询所有对象，返回List
	 */
	public List<T> findAll()
	{
		return this.getDao().findAll();
	}

	/**
	 * 根据id列表 查询所有的对象，返回List
	 */
	public List<T> findAll(Iterable<Long> ids)
	{
		return this.getDao().findAll(ids);
	}

	/**
	 * 查询所有对象，并排序，返回List
	 */
	public List<T> findAll(Sort sort)
	{
		return this.getDao().findAll(sort);
	}

	/**
	 * 查询，支持分页和排序 
	 */
	public Page<T> findAll(Pageable pageable)
	{
		return this.getDao().findAll(pageable);
	}

	/**
	 * 根据id 判断对象是否存在 
	 */
	public boolean exists(Long id)
	{
		return this.getDao().exists(id);
	}

	/**
	 * 计算对象的总个数  
	 */
	public long count()
	{
		return this.getDao().count();
	}


	/**
	 * 强制缓存与数据库同步
	 */
	@Transactional
	public void flush()
	{
		this.getDao().flush();
	}
	
	
}
